package org.example.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}

/**
 * rdd的算子，也就是rdd的方法
 *
 *
 */
object Spark13_RDD_Operator_PartitionBy {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val context = new SparkContext(conf)
    // key value 类型
    val rdd1 = context.makeRDD(List(1,2,3,4),2)

    var mapRDD = rdd1.map((_,1))// 转换成键值类型

    // 隐式转换 RDD=》PairRDDFunctions
    // partitionBy 根据指定的分区规则，对数据进行重分区
    // 你也可以实现 自己的分区方法 Partitioner，实现这个
    mapRDD.partitionBy(new HashPartitioner(2)).saveAsTextFile("output")

    // 如果你多次分区怎么办，例如把上面的代码重复执行
    // 其实在这个算子中，如果发现，你使用的分区方法一直，且分区数量一直，会将结果直接传递，而不会重复计算

    context.stop()
  }
}
